perm filename XIP1[DOC,BGB] blob
sn#093418 filedate 1974-03-25 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00008 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00002 00002 TITLE XIP - XEROX IMMEDIATE DOCUMENT PRINTER - BGB - 24 MARCH 1974.
00005 00003 SAIL LIKE SUBROUTINE LINKAGE.
00009 00004 START ADDRESS ENTRY.
00010 00005 TEXT BUFFER SPECIFICATIONS.
00012 00006 XGP RASTER SPECIFICATIONS.
00015 00007 SUBR(XGPOUT) OUTPUT BUFFER TO XGP FROM SECONDARY STORAGE.
00017 00008 SUBR(PRINT) PLACE A GLYPH INTO XGP BUFFER AT ROW,COL.
00022 ENDMK
⊗;
TITLE XIP - XEROX IMMEDIATE DOCUMENT PRINTER - BGB - 24 MARCH 1974.
;ALTERNATE PDP-10 MNEMONICS.
OPDEF DIP[HRLM]↔OPDEF DAP[HRRM]
OPDEF CAR[HLRZ]↔OPDEF CDR[HRRZ]
OPDEF LAC[MOVE]↔OPDEF DAC[MOVEM]
OPDEF DZM[SETZM]↔OPDEF GO[JRST]
OPDEF FLOAT[FSC 233]↔OPDEF FIXX[FIX 233000]
;RETURN FROM AN N-ARGUMENT SUBROUTINE CALL.
↓P←←17
DEFINE POP0J<POPJ P,>
↓POP1J.:↔SUB P,[2(2)]↔GO@2(P)↔DEFINE POP1J<GO POP1J.>
↓POP2J.:↔SUB P,[3(3)]↔GO@3(P)↔DEFINE POP2J<GO POP2J.>
↓POP3J.:↔SUB P,[4(4)]↔GO@4(P)↔DEFINE POP3J<GO POP3J.>
↓POP4J.:↔SUB P,[5(5)]↔GO@5(P)↔DEFINE POP4J<GO POP4J.>
;ACCUMULATOR AND TEMPORARY DATA MANAGEMENT.
DEFINE ACCUMULATORS(LIST){ACPTR←←2 ;DECLARE ACCUMULATORS.
FOR AC⊂(LIST)<AC←ACPTR↔ACPTR←←ACPTR+1↔>}
FOR @$ I←0,16<AC.$I←I↔> ;ACCUMULATOR NAMES FOR RAID.
DEFINE DECLARE (LIST){
FOR VARNAM⊂(LIST)<VARNAM:0↔>}
;MACROS TO SAVE AND RESTORE AC'S - SAVAC, GETAC.
DEFINE SAVAC $(N){LAC[XWD 2,[AC2: FOR I←2,N{0↔}]]↔BLT AC2+N-2}
DEFINE GETAC (N){LAC[XWD AC2,2]↔BLT N}
;FATAL ERROR MESSAGE.
DEFINE FATAL(STR){PUSHJ 17,FATAL.↔ASCIZ/STR/}
FATAL.:OUTSTR[BYTE(7)15,12(21)"FAT"↔"AL - "⊗1↔0]
OUTSTR @(17)↔INCHRW↔GO .-1↔LIT
DEFINE CRLF{OUTSTR[BYTE(7)15,12]}
%←←400000
;SAIL LIKE SUBROUTINE LINKAGE.
DEFINE CAT $(A,B){A$B} ;CONCATENATION.
.PLEVEL←←0 ;PDL BACK POINTER.
.SLEVEL←←0 ;DEPTH OF NESTED SUBROUTINE DECLARATIONS.
;SUBROUTINE DECLARATION MACROS - SUBR & ENDR.
;(Reminder: Right-arrow, "→" is FAIL's macro arg EVAL).
DEFINE SUBR(NAME,X1,X2,X3,X4,X5)↔{BEGIN NAME↔INTERN NAME
GLOBAL .PLEVEL↔GLOBAL .SLEVEL↔.SLEVEL←←.SLEVEL+1
CAT(.SBR,→.SLEVEL)←←.PLEVEL ↔.PLEVEL←←.PLEVEL+1
IFDIF<><X1>{DEFARG(X1,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1
IFDIF<><X2>{DEFARG(X2,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1
IFDIF<><X3>{DEFARG(X3,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1
IFDIF<><X4>{DEFARG(X4,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1
IFDIF<><X5>{DEFARG(X5,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1}}}}}
XWD 777000+.PLEVEL-CAT(.SBR,→.SLEVEL)-1,[SIXBIT|NAME|]
↓NAME:;}
;DEFINE ARGUMENT NAME MACRO.
DEFINE DEFARG(NAME,LEVEL){DEFINE NAME{LEVEL-.PLEVEL(17)}}
;SUBROUTINE TERMINATION MACRO.
DEFINE ENDR{.PLEVEL←←CAT(.SBR,→.SLEVEL)
.SLEVEL←←.SLEVEL-1↔LIT↔BLOCK 0↔BEND }
;SUBROUTINE CALLING MACROS - CALL & SETQ.
DEFINE CALL(NAME,X1,X2,X3,X4,X5)
{GLOBAL .SLEVEL,.PLEVEL↔.SLEVEL←←.SLEVEL+1
CAT(.SBR,→.SLEVEL)←←.PLEVEL
IFDIF<><X1>{PUSH P,X1↔.PLEVEL←.PLEVEL+1
IFDIF<><X2>{PUSH P,X2↔.PLEVEL←.PLEVEL+1
IFDIF<><X3>{PUSH P,X3↔.PLEVEL←.PLEVEL+1
IFDIF<><X4>{PUSH P,X4↔.PLEVEL←.PLEVEL+1
IFDIF<><X5>{PUSH P,X5↔.PLEVEL←.PLEVEL+1 }}}}}
IFDIF<><NAME>{PUSHJ P,NAME }
.PLEVEL←←CAT(.SBR,→.SLEVEL)↔.SLEVEL←←.SLEVEL-1}
DEFINE SETQ(VAR,LIST){CALL(LIST)↔DAC 1,VAR}
;STACK ACCESSING MACROS - PUSHP & POPP.
DEFINE PUSHP(ARG){PUSH P,ARG↔.PLEVEL←←.PLEVEL+1}
DEFINE POPP(ARG) {POP P,ARG↔.PLEVEL←←.PLEVEL-1}
;START ADDRESS ENTRY.
;--------------------------------------------------------------------
PDL: BLOCK 100
SA: CALLI
LAC P,[IOWD 100,PDL]
CALL(MKXBUF) ;MAKE XGP BUFFER,
CALL(COMSCAN) ;COMMAND LINE SCAN.
OUTSTR[ASCIZ/
END OF COMMAND LINE.
/]↔ INCHRW↔GO .-1
CALL(XGPOUT)
EXIT
;--------------------------------------------------------------------
;TEXT BUFFER SPECIFICATIONS.
CHRCNT: 0 ;NUMBER OF CHARACTERS REMAINING.
TXTPTR: 0 ;CURRENT TEXT POINTER.
TXTORG: 0 ;ORIGIN OF TEXT BUFFER.
TXTEND: 0 ;END OF TEXT BUFFER.
SUBR(COMSCAN) ;COMMAND LINE SCAN.
COMMENT .-----------------------------------------------------------.
;RESCAN COMMAND LINE FOR CHARACTERS RIGHT OF SEMI-COLON.
RESCAN↔INCHSL↔EXIT ;READ CHARACTER LEFT OF SEMICOLON.
CAIN 15↔EXIT ;EXIT NO SEMICOLON.
CAIE";"↔GO .-5↔DZM CHRCNT
CDR JOBFF↔HRLI 440700 ;TEXT BUFFER POINTERS.
DAC TXTPTR↔DAC TXTORG
INCHSL 1↔EXIT ;READ FIRST CHARACTER.
DZM BUGFLG#↔CAIN 1,"!" ;"!" FORCES WAIT AFTER RESCAN.
SETOM BUGFLG↔GO .+3
INCHSL 1↔GO .+4↔AOS CHRCNT ;READ REMAINING CHARACTERS.
IDPB 1,0↔GO .-4↔DAC TXTEND
SKIPN BUGFLG↔POP0J
OUTSTR[ASCIZ/BEGIN./] ;WAIT FOR DEBUGGER.
INCHRW↔CRLF↔POP0J
ENDR COMSCAN;3/25/74(BGB)--------------------------------------------
;XGP RASTER SPECIFICATIONS.
;XGP RASTER PAGE BUFFER.
ORGXGP:0 ;XGP BUFFER IN CORE.
ENDXGP:0
;XGP RASTER DIMENSIONS.
WWIDTH←←=36 ;WORD WIDTH OF A ROW.
NCOLS←←(WWIDTH-1)*=36 ;NUMBER OF COLUMNS IS 1260.
MROWS←←=1800 ;NUMBER OF ROWS IS 1800.
BUFSIZ←←WWIDTH*MROWS
ROW:0 ;XGP "PEN" POSITION.
COL:0
DROW:0 ;DELTA PEN POSITION FOR LINE FEED AND SPACE.
DCOL:0
SUBR(MKXBUF) ;MAKE XGP PAGE BUFFER.
COMMENT .-----------------------------------------------------------.
CDR JOBFF↑↔ADDI 10↔DAC ORGXGP
ADDI BUFSIZ-1↔DAC ENDXGP↔ADDI 10
CORE↔GO[FATAL(CAN'T GET CORE FOR XGP BUFFER.)]
LAC 1,ORGXGP↔SETZM(1)
DIP 1,1↔AOS 1↔BLT 1,@JOBREL↑
POP0J
ENDR MKXBUF;3/24/74(BGB)---------------------------------------------
SUBR(MKFRAM) ;MARKS BORDER OF XGP BUFFER ON PAGE.
COMMENT .-----------------------------------------------------------.
SETO
LAC 1,ORGXGP↔MOVEI 2,MROWS
L1: DPB 0,[POINT 9,1(1),8]
DPB 0,[POINT 9,=35(1),35]
ADDI 1,WWIDTH↔SOJG 2,L1
MOVSI 1,-9*=36
HRR 1,ORGXGP
SETOM (1)
SETOM =91*=36(1)
SETOM =1791*=36(1)
AOBJN 1,.-3
POP0J
ENDR MKFRAM;---------------------------------------------------------
SUBR(XGPOUT) OUTPUT BUFFER TO XGP FROM SECONDARY STORAGE.
COMMENT .-----------------------------------------------------------.
;PUT XGP CONTROL WORD IN EACH ROW.
LAC 0,[1B11+=250B23+WWIDTH-1] ;COLUMN ZERO POSITION.
LAC 1,ORGXGP↔MOVEI 2,MROWS
DAC 0,(1)↔ADDI 1,WWIDTH↔SOJG 2,.-2
MOVSI -BUFSIZ-5 ;2+BUFSIZ+3
HRR ORGXGP↔SUBI 3
DAC DUMARG ;DUMP ARGUMENT.
;SETUP END CUTS AND SPACES.
LAC 1,ORGXGP↔SUBI 1,3
PUSH 1,[1B0] ;CUT AT TOP OF PAGE.
PUSH 1,[=150B11] ;3/4" MARGIN SPACE AT TOP OF PAGE.
LAC 1,ENDXGP
PUSH 1,[=250B11] ;5/4" MARGIN SPACE AT BOTTOM OF PAGE.
PUSH 1,[1B0] ;CUT AT THE BOTTOM OF PAGE.
PUSH 1,[0] ;LAST WORD OF XGP BUFFER.
;PRINT A PAGE ON THE XGP.
INIT 2,17↔SIXBIT/XGP/↔0↔GO[
OUTSTR[ASCIZ/XGP INIT FAILED.
/]↔ POP0J]↔LOCK
OUTSTR[ASCIZ/PAGE TO XGP.../]
OUT 2,DUMARG
UNLOCK
RELEASE 2,
OUTSTR[ASCIZ/FINISHED.
/]↔ POP0J
DUMARG: 0↔0
ENDR XGPOUT;3/24/74(BGB)------------------------------------------
SUBR(PRINT) PLACE A GLYPH INTO XGP BUFFER AT ROW,COL.
COMMENT .-----------------------------------------------------------.
;Implicit Arguments to PRINT are ROW, COL, CHAR,
;FONT, FONTAB, ORGXGP, ENDXGP, TJMODE.
ACCUMULATORS{G,B,B2,M,N,I,X16}
SKIPN CHAR↔POP0J ;IGNORE NULL CHARACTERS.
LAC 1,FONT ;CURRENT FONT NUMBER.
SKIPN 2,FONTAB(1)↔POP0J ;FONT BASE ADDRESS.
LAC I,203(2) ;ROWS BETWEEN TOP AND BASE LINE.
ADD 2,CHAR ;POINTER INTO FONT'S CHARACTER TABLE.
CAR N,(2) ;COLS WIDE OF THE GLYPH.
CDR G,(2)↔SKIPN G↔POP0J ;EXIT WHEN NO CHARACTER.
ADD G,FONTAB(1)↔AOS G ;CHARACTER'S GLYPH POINTER.
CDR M,(G) ;ROWS HIGH OF THE GLYPH.
CAR 0,(G) ;ROWS FROM TOP TO FIRST ROW OF GLYPH.
SUB 0,I ;ROWS ABOVE CURRENT XGP PEN POSITION.
ADD 0,ROW↔SUB 0,QLO
IMULI WWIDTH
ADD ORGXGP↔DAPZ B ;WORD POINTER INTO XGP BUFFER.
LAC 0,COL
SKIPE TJMODE↔GO .+3 ;CLIP LINE OVERFLOW IF TJMODE=0
CAML 0,RMAR↔POP0J
IDIVI 0,=36 ;REMAINDER IN AC-1 !
AOS↔ADD B,0↔DAC B,B2 ;WORD POINTER INTO XGP BUFFER.
ADDM N,COL ;UPDATE XGP PEN COLUMN POSITION.
TLO G,444400↔AOS G ;SETUP GLYPH BYTE POINTER.
CAILE N,=36↔GO[
IDIVI N,=36↔AOJA N,L0] ;WHEN CHARACTER WIDTH ≥ =36.
DPB N,[POINT 6,G,11] ;SIZE OF BYTE.
ADD 1,N↔SUBI 1,=36 ; =36 - CHRWID - REMAINDER
LACI N,1
L0: MOVNS 1↔DAP 1,L3 ;BYTE POSITION WITH RESPECT TO WORD BOUNDARYS.
;INCLUSIVE OR GLYPH BITS INTO THE XGP BUFFER.
L1: LAC I,N
L2: ILDB 0,G↔SETZ 1,
L3: LSHC 0,0
CAML B,ORGXGP↔CAMLE B,ENDXGP↔SKIPA↔IORM 0,(B)
AOS B↔JUMPE 1,L4
CAML B,ORGXGP↔CAMLE B,ENDXGP↔SKIPA↔IORM 1,(B)
L4: SOJG I,L2↔LAC B,B2
ADDI B,WWIDTH↔DAC B,B2
SOJG M,L1
POP0J
ENDR PRINT;5/23/73(BGB)----------------------------------------------
END SA